
package ija.model;

import ija.model.basis.Desk;
import ija.model.players.Player;
import ija.model.types.Color;
import ija.xls.notation.GameMove;

/**
 * Rozhraní modelu hry.
 * Datová část MVC architektury, využívané pro věh hry.
 * 
 * @author Radek Nečas, xnecas18
 */
public interface GameModel {
    
    /**
     * Inicializování hrací desky.
     * Metoda naplní šachovnici figurkami do základního postavení.
     * @param topPlayerColor udává jakou barvu budou mít figurky v horní části šachovnice (od řádku: 8).
     */
    public void initGame(Color topPlayerColor);
    
    
    /**
     * Metoda pro získání šachovnice.
     * Skrze šachovnici se poté získávají další informace (pozice, figurky).
     * Získané objekty slouží jen pro čtení. Neměli by se přímo měnit.
     * 
     * @return šachovnice, v níž jsou umístěny figurky 
     */
    public Desk getDesk();
    
    
    /**
     * Provádí pohyb figurky.
     * Aktualizuje všechny související objekty (figurky, pozice v dané šachovnici).
     * Pozice musí být na téže šachovnici (ale není testováno).
     * 
     * @param moveDescription popisuje pohyb (počáteční, koncová pozice, operace)
     * @return true pokud dojde ke změně modelu, jinak false
     */
    public boolean move(GameMove moveDescription);
    
    /**
     * Metoda pro nastavení hráče
     * @param id identifikator hráče, jenž se bude nastavovat (povolené 0 a 1).
     * @param p hráč který se nastaví (zkopíruje se odkaz)
     * @return true pokud je hráč nastaven, false při chybě (špatné id)
     */
    public boolean setPlayer(int id, Player p);
    
    
    /**
     * Metoda pro získání hráče.
     * @param id identifikátor hráče (povolené hodnoty 0 a 1).
     * @return hráč nebo null při chybě (špatné id)
     */
    public Player getPlayer(int id);
    
    /**
     * Vrátí aktivního hráče
     * @return aktivní hráč
     */
    public Player getActivePlayer();
    
    /**
     * Aktivuje určeného hráče.
     * Pokud není metoda volána, je automaticky aktivní hráč 0.
     * @param id identifikátor hráče, jenž má být aktivován
     * @return true ok, jinak false (špatné id)
     */
    public boolean activatePlayer(int id);
    
    /**
     * Aktivuje dalšího hráče (toho, který je na řadě).
     */
    public void nextPlayer();
}
